home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSRC.LZH
/
CDRC_.C
< prev
next >
Wrap
Text File
|
1995-03-20
|
24KB
|
1,091 lines
#define TrkMax 400
#include "_TNB.c"
#define UNchar unsigned char
#define UNint unsigned int
extern short SCSI_ID;
extern short LEDVMOD;
extern short AutoMode; // 0:ノーマル 1:オート(含loop)
extern short RndMode; // 0:ノーマル 1:ランダム
extern short ReptMode; // 0:ノーマル 1:リピート
extern short MemMode; // 0:ノーマル 1:メモリー
extern short MemLong; // メモリながさ 0以外ならMEMORY
extern short MemPt; // メモリポインタ
extern UNchar MemSock[]; // メモリ
extern short RndLong; // ランダムテーブルながさ 0以外ならMEMORY
extern short RndPt; // ランダムポインタ
extern UNchar RndSock[]; // ランダムテーブル
extern short TrkNo; // 演奏中 トラックナンバー/メモリポインタ
extern short TrkNoS; // 演奏中 トラックナンバー/メモリポインタ
extern short PauseMode; // 0:特に 1:ポーズ中
extern short ExTrak; // 1;拡張トラックあり
extern char LEDBUF[8][16]; //テキスト表示用のパターンバンク
extern char NAMEBUF[40][16];//表示幅は 36
extern char CHARBUF[40]; //LEDに表示されている文字列
extern short CDIN; //0:CDは入っていない 1:入っている
extern int CdListS; //CDLISTにあるなら 1
extern int CdTrak; //
extern int CdLong; // 長さ
extern char CdName[40]; // CD名
extern int ListStTm[TrkMax]; // スタート時間
extern int ListLong[TrkMax]; // ながさ時間
extern char ListName[TrkMax][40]; // 名前
extern int O_CdTrak; //
extern int O_ListStTm[100]; // スタート時間
extern int O_ListLong[100]; // ながさ時間
extern UNchar O_ListTrak[100]; //
extern short CddevSw; //0: SCSI直接 1:計測IOCTRL
extern short CddDrvNo; //計測IOCTRL用ドライヴNO
extern UNchar *SetNameAdd;
/********************
常駐部
*********************/
/*------------------------------*/
/* 構造体 */
/*------------------------------*/
typedef struct {
int fg; /* 状態 0x11 演奏中,0x12 演奏中断 */
int track_no; /* 曲番号 */
int time; /* 現在の演奏時間 */
int address; /* 演奏アドレス */
int track_long; /* 演奏中の曲のながさ*/
} PLYINF;
extern PLYINF plyinf;
#define min 1
#define max CdTrak
static int CdPlayEndAdds;
/*----------------------------------------------------------------------------
演奏ルーチン
----------------------------------------------------------------------------*/
/**************************************
一曲だけ演奏する。
[何番演奏する]
start=
Track No
0x100越の場合 MSF指定になる
end=
Track No
-1の場合 max に
0の場合 startのトラックの最後まで指定
0x100越の場合 MSF指定になる
[戻り値] マイナス:エラー
****************************************/
int CdPlay( int start, int end )
{
int start_address,leadout_address;
int end_address;
int i;
leadout_address=CdLong;
CdPlayEndAdds=end;
if ( start<0x100 && (start<min || start>max) ){
TrkNo=0;
StpDsk();
//fprintf_(1,"指定された曲番号は、存在しません。\n");
return(-4);
}
if ( end<0 )
end = max;
if ( end>0 && end<0x100 && (end<min || end>max) ){
TrkNo=0;
StpDsk();
//fprintf_(1,"指定された曲番号は、存在しません。\n");
return(-4);
}
if ( start<0x100 ){
start_address = ListStTm[start]; // スタート時間
if ( ((UNint)start_address&(UNint)0x80000000)==0 ){
;
} else if ( CdPlayEndAdds<0 && start==1 && max!=1 ){
i=CdPlay( 2,-1); //MD Towns CD 対策
if ( i==0 ) i=1;
return( i );
} else {
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
return(-2);
}
plyinf.address=start_address; /* 演奏アドレス */
plyinf.track_no=start; /* 曲番号 */
plyinf.time=0; /* 現在の演奏時間 */
} else {
start_address = start;
ChkPlyDispA(start_address);
}
if ( end==0 ){
if ( plyinf.track_no==max )
end_address = subtime(leadout_address,1);
else end_address = subtime(ListStTm[plyinf.track_no+1],1);
} else if ( end<0x100 ){
if ( end==max )
end_address = subtime(leadout_address,1);
else end_address = subtime(ListStTm[end+1],1);
} else {
end_address=end;
}
TrkNo=0;
/* 演奏開始 */
if ( PlyDsk( start_address, end_address ) != 0 ){
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
return(-2);
}
plyinf.fg=0x11; /* 状態 0x11 演奏中,0x12 演奏中断 */
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
WaitCC2();
return(0);
}
/**************************************
全曲を演奏する
[戻り値] マイナス:エラー
**************************************/
int CdPlay_all( void )
{
int start_address,leadout_address;
TrkNo=0;
start_address = ListStTm[min];
leadout_address = subtime(CdLong,1);
CdPlayEndAdds=-1;
if ( ((UNint)start_address&(UNint)0x80000000)==0 ){
if( PlyDsk(start_address,leadout_address) != 0 ){ /* 演奏開始 */
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error");
return(-2);
}
plyinf.fg=0x11; /* 状態 0x11 演奏中,0x12 演奏中断 */
plyinf.track_no=min; /* 曲番号 */
plyinf.time=0; /* 現在の演奏時間 */
plyinf.address=start_address; /* 演奏アドレス */
TrkNo=min;
TrkNoS=TrkNo;
SetTrkLong();
WaitCC2();
return(0);
} else if ( min!=max ) {
return( CdPlay( min+1,-1) ); //MD Towns CD 対策
} else {
TrkNo=0;
StpDsk();
//fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error");
return(-2);
}
return(0);
}
/*----------------------------------------------------------------------------
演奏補ルーチン
----------------------------------------------------------------------------*/
/************************************
[UNDO] [R.UP][R.DN]
演奏を再開させる(曲単位)
[引数] 現在からの±No ☆メモリ対応
[戻り値] マイナス:エラー
************************************/
int CdPlay_restart( int no )
{
int i,r;
if ( TrkNo==0 )
return(-1);
if ( RndMode ){
/*ランダムモード*/
if ( no==0 ){
i= TrkNo;
r=CdPlay( i,i );
} else {
if ( ++RndPt>=RndLong ){
r=CdPlay_Rnd2();
} else {
i=RndSock[RndPt];
r=CdPlay( i,i );
}
if ( r<0 ){
if ( ++RndPt>=RndLong ){
r=CdPlay_Rnd2();
} else {
i=RndSock[RndPt];
r=CdPlay( i,i );
}
}
MemChkT();
}
return( r );
}
if ( MemLong==0 ){ /*メモリされていない*/
/* 最後まで演奏する */
i= TrkNo + no;
if ( i<min ) i=max;
if ( i>max ) i=min;
if ( ReptMode )
r=CdPlay( i,i );//ランダムならその曲のみ
else r=CdPlay( i,-1 );
if ( r<0 ){
i+=no;
if ( i<min ) i=max;
if ( i>max ) i=min;
if ( ReptMode )
r=CdPlay( i,i );//ランダムならその曲のみ
else r=CdPlay( i,-1 );
}
return( r );
} else {
/*メモリされている*/
if ( no==0 ){
i= TrkNo;
} else {
i=MemPt+no;
if ( i<0 ) i=MemLong-1;
if ( i>=MemLong ) i=0;
MemPt=i;
i=MemSock[i];
}
r=CdPlay( i,i );
return( r );
}
return(-1);
}
/********************************
シーク処理(値を戻すだけ)
[引数] 現在からの巻き戻し(-1)早送り(+1)
[戻り値] 目的MSF
0なら動けない
********************************/
int SeekDisp(int no)
{
extern short TsekSw;
int i,l;
extern int SeekNow; //*
extern short SeekNowTk; //*_SeekNow補佐 trakno
if ( TrkNo==0 || no==0 )
return(0);
if ( SeekNow<0 ){
/* 初めてのコール*/
SeekNow=plyinf.time;
SeekNowTk=plyinf.track_no;
}
if ( TsekSw<30 ) l=22; //0.3秒単位
else if ( TsekSw<60 ) l=37; //0.5秒単位
else l=0x100;//1.0秒単位
if ( no<0 ){
i=SeekNow;
SeekNow=subtime(SeekNow,l);
if ( SeekNow>i || SeekNow<0 )
SeekNow=0;
} else {
if ( SeekNow<=subtime(ListLong[SeekNowTk],0x200) )
SeekNow=addtime(SeekNow,l);
else SeekNow=subtime(ListLong[SeekNowTk],0x100);
}
return( SeekNow+1 );
}
#if 0
/********************************
スキャン処理 (注)ベンダコールのため使えず(シクシーク)
[引数] 現在からの±No
[戻り値] マイナス:エラー
********************************/
int ScanDisp(int no)
{
int i,r;
if ( no==0 ) return(-1);
i= plyinf.fg;
if( i==0x11 ){
/* 演奏中 */
if ( no<0 ) r=Scan( 0x10 ,plyinf.time); //no==0;早 0x10;巻き
else r=Scan( 0x00 ,plyinf.time); //no==0;早 0x10;巻き
return( r );
}
return(-1);
}
/********/
int Scan( int no ,int start) //no==0;早 0x10;巻き
{
/* Play Audio MSF Command */
unsigned char buf[16];
buf[0] = 0xCD; /* Play Audio MSF Command */
buf[1]=no;
buf[2]=0;
buf[3] = ( start / 0x10000 ) & 0xff;
buf[4] = ( start / 0x100 ) & 0xff;
buf[5] = start & 0xff;
buf[6] = 0;
buf[7] = 1;
buf[8] = 0;
buf[9] = 0b01000000;
return( scsi_cmd( 10, buf, 0, buf ) );
}
#endif
/*************************************************************
ChkPlyバッファー調整
*************************************************************/
void ChkPlyDisp()
{
int i,t,ad;
t=(plyinf.track_no&0xFFFF);
ad=plyinf.address;
i=O_ListTrak[t];
for(;i<=max;i++){
if ( ad<(ListStTm[i]&0xFFFFFF) )
break;
}
plyinf.track_no=i-1;
plyinf.time=subtime(ad,ListStTm[i-1]);
}
/*++++++++*/
void ChkPlyDispA(int ad) //adのみから計算
{
int i;
plyinf.address=ad;
for(i=min;i<=max;i++){
if ( ad<(ListStTm[i]&0xFFFFFF) )
break;
}
plyinf.track_no=i-1;
plyinf.time=subtime(ad,ListStTm[i-1]);
}
/**********/
void SetTrkLong()
{
plyinf.track_long=ListLong[TrkNo]; // ながさ時間
}
/*************************************
演奏時間の計算
**************************************/
void ProgTimeCalc(st)
int *st;
{
int i,j;
if ( TrkNo==0 ){
st[0]=st[1]=0;
} else if ( ReptMode ){ // 0:ノーマル 1:リピート
st[0]=ListLong[TrkNo]; // 長さ
st[1]=0;
} else if ( RndPt>=0 ){ // ランダムポインタ
st[0]=0;
for(i=0;i<RndPt;i++)
st[0]=addtime(st[0],ListLong[RndSock[i]]);
st[1]=st[0];
for(;i<RndLong;i++)
st[0]=addtime(st[0],ListLong[RndSock[i]]);
} else if ( MemPt>=0 ){ // メモリポインタ
st[0]=0;
for(i=0;i<MemPt;i++)
st[0]=addtime(st[0],ListLong[MemSock[i]]);
st[1]=st[0];
for(;i<MemLong;i++)
st[0]=addtime(st[0],ListLong[MemSock[i]]);
} else if ( CdPlayEndAdds<0 ){
st[0]=subtime(CdLong,ListStTm[1]); // 長さ
st[1]=subtime(ListStTm[TrkNo],ListStTm[1]);
} else {
st[0]=ListLong[TrkNo]; // 長さ
st[1]=0;
}
}
/*************************************
時間 bcd 同志の引き算 t1-t2
**************************************/
int subtime( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
int t1m,t1s,t1u;
int t2m,t2s,t2u;
t1m=(t1>>16) & 0xff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u-=t2u)<0 ){
if ( (t1u+=75)<0 )
t1u+=75;
t2s++; //秒のマイナス値を+1
}
if ( (t1s-=t2s)<0 ){
if ( (t1s+=60)<0 )
t1s+=60;
t2m++; //分のマイナス値を+1
}
t1m-=t2m; //ここでマイナス値はおかしいはずなのだ
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*************************************
時間 bcd 同志の足し算 t1+t2
**************************************/
int addtime( int t1,int t2 )
{
/* 00:mm:ss:xx 何分何秒何1/75秒 */
int t1m,t1s,t1u;
int t2m,t2s,t2u;
t1m=(t1>>16) & 0xff;
t1s=(t1>>8 ) & 0xff;
t1u=(t1 ) & 0xff;
t2m=(t2>>16) & 0xff;
t2s=(t2>>8 ) & 0xff;
t2u=(t2 ) & 0xff;
if ( (t1u+=t2u)>=75 ){
t1u-=75;
t1s++;
}
if ( (t1s+=t2s)>=60 ){
t1s-=60;
t1m++;
}
t1m+=t2m;
return( (t1m<<16)|(t1s<<8)|t1u );
}
/*----------------------------------------------------------------------------
タイトルルーチン
----------------------------------------------------------------------------*/
/************************************************
引数により名前ポインタアドレス
[戻り値] アドレス
*************************************************/
char *NamePoint(kn,ofs)
int kn,ofs;
{
int i,l;
char *s;
if ( ((UNint)ListLong[kn]&(UNint)0x80000000)==0 )
return(ListName[kn]);
//拡張曲名あり
for(l=TrkMax-1;l>CdTrak;l--){
i=ListLong[l];
if ( (i&0xFF0000)==0xFF0000 ){
if ( (i&0xFF)==kn )
break;
}
}
if ( l<=CdTrak )
return(ListName[kn]); //なぜか無い
s=ListName[kn];
for(;l>CdTrak;l--){
i=ListLong[l];
if ( (i&0xFF0000)!=0xFF0000 )
break;
if ( (i&0xFF)!=kn )
break;
if ( ofs>=(ListStTm[l]&0xFFFFFF) )
s=&ListName[l][2];
}
return(s);
}
/*************************************************************
LED表示文字列制作
*************************************************************/
#define jstrlen(SR) \
({ char *st_=(SR); int l_=0,c_; \
while( c_=*(st_++) ){ \
l_++; if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ l_++; st_++; } \
} (l_); \
})
/*+++++++++*/
void SetNameLed(na)
UNchar *na;
{
int i,l,c;
UNchar *ad=(void*)NAMEBUF;
UNchar *ac=(void*)CHARBUF;
i=0;
if ( SetNameAdd==na ) //既に書いた
return;
FncBarC();
SetNameAdd=na;
if ( CdName[0]!=' ' ){ // CD名
l=jstrlen(na);
for(;i<(36-l)/2;i++,ad+=16){
SetSp(ad);
*ac++=0x20;
}
}
for(;i<40-1;i++,ad+=16){
c=(*ac++=*na++);
if ( c==0 )
break;
if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
i++;
c=c*0x100+(*ac++=*na++);
}
if ( SetFont(ad,c)==2 )
ad+=16;
}
for(;i<40-1;i++,ad+=16)
SetSp(ad);
}
/*----------------------------------------------------------------------------
タイトルリスト解析ルーチン
----------------------------------------------------------------------------*/
/************************************************
CDCLISTより、現在のCDちぇっっく
[戻り値] 0 :
-1 : ERR!
*************************************************/
int CdListSub()
{
int leadout_address,min_,max_;
int i,l;
int start,end;
int lst[100];
CdListS=0; //CDLISTにあるなら 1
ExTrak=0;
if ( CDROM_chk() ){
//fprintf_(1,"SCSI-ID=%2 の装置は、CD-ROM ではないようです。\r\n",SCSI_ID );
return(-100);
}
if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
//fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
return(-1);
}
end = leadout_address;
/*はじめにチェック*/
MemLong=0; //メモリながさ
CdLong=end; // 長さ
O_CdTrak=max_;
CdTrak=max_;
CdName[0]=0;
if ( Music_inf_all( min_,max_,&lst ) ){
//fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
return(-1);
}
for(l=min_;l<=max_;l++){
start=lst[l];
if( l==max_ ){
end = subtime( leadout_address,1 );
} else {
end=lst[l+1];
end = subtime( end,1 );
}
O_ListStTm[l]=start;
ListStTm[l]=start;
i= subtime( end,subtime( start,1 ) );
O_ListLong[l]=i; // 長さ
ListLong[l]=i; // 長さ
ListName[l][0]=0;
ListName[l][2]=0;
O_ListTrak[l]=l; //
}
for(;l<100;l++){
ListName[l][0]=0;
ListName[l][2]=0;
ListLong[l]=0;
O_ListLong[l]=0;
}
for(;l<TrkMax;l++){
ListName[l][0]=0;
ListName[l][2]=0;
ListLong[l]=0;
}
O_ListTrak[max_+1]=max_+1; //
O_ListStTm[max_+1]=CdLong;
//ListStTm[max_+1]=CdLong;
SetNameAdd=0;
return(0);
}
/***************/
void CdNameClr()
{
int l;
CdName[0]=0;
for(l=0;l<TrkMax;l++){
ListName[l][0]=0;
ListName[l][2]=0;
(UNint)ListLong[l]&=(UNint)0x7FFFFFFF; //拡張曲名fg
}
SetNameAdd=0;
}
/************************************************
CDCLISTより、現在のCDちぇっっく
先にCdListSub()を実行のこと
[戻り値] 0 : OK、あった 設定した
-1 : ERR! なかった
*************************************************/
int CdListDisp(f)
int f; //ファイルポインタ
{
int l;
if ( CdListDisp__(f) ){
NoTtlFile();
return(-1);
}
ListStTm[CdTrak+1]=CdLong;
for(l=1;l<=CdTrak;l++){
(UNint)ListLong[l]&=(UNint)0xFF000000;
ListLong[l]|=subtime( ListStTm[l+1],ListStTm[l]);
}
return(0);
}
/*+++++++++++*/
int CdListDisp__(f)
int f; //ファイルポインタ
{
int leadout_address,min_,max_;
int i,j,l,tr;
int kcn;
char tnum[100];
unsigned char *s,*d;
if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
//fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
return(-1);
}
for(i=0;i<100;tnum[i++]=1);
kcn=TrkMax-1; //(l=TrkMax-1;kcn>CdTrak;kcn--){
CdTrak=O_CdTrak;
for(;;){
if ( (int)(s=Fgets(f))<=0 ) return(-1); //ファイルエンド
//fprintf_(1,s);
//fprintf_(1,"\r\n");
//まずは' All ('探し
if ( s[4]=='A' && s[5]=='l' && s[6]=='l' && s[8]=='('){
;
} else continue;
i=(s[ 9]-'0')*0x10000*10+
(s[10]-'0')*0x10000 +
(s[12]-'0')*0x100 *10+
(s[13]-'0')*0x100 +
(s[15]-'0') *10+
(s[16]-'0');
if ( CdLong!=i ) continue; //違う
s=&s[17];
for(;*s!=9;s++);
for(;*s==9;s++);
d=CdName;
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
//fprintf_(1,CdName);
//fprintf_(1,"\r\n");
if ( (int)(s=Fgets(f))<=0 ) return(-1); //ファイルエンド
//1行空のはず
for(tr=l=min_;l<=max_+1;l++,tr++){
if ( (int)(s=Fgets(f))<=0 ) return(-1); //ファイルエンド
//fprintf_(1,s);
//fprintf_(1,"\r\n");
//中間曲名
if ( s[0]==9 && s[1]=='(' && s[2]=='*' && s[3]==')' ){
if ( kcn<=tr ){
return(-1); //多すぎ
}
l--;
tr--;
i=(s[ 4]-'0')*0x10000*10+
(s[ 5]-'0')*0x10000 +
(s[ 7]-'0')*0x100 *10+
(s[ 8]-'0')*0x100 +
(s[10]-'0') *10+
(s[11]-'0');
(UNint)ListLong[tr]|=(UNint)0x80000000; //拡張曲名fg
ListLong[kcn]=0xFF0000+(tr);
ListStTm[kcn]=i;
s=&s[12];
for(;*s!=9;s++);
for(;*s==9;s++);
d=ListName[kcn];
*d++=0;
*d++=0;
for(i=2;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
kcn--;
continue;
}
//拡張曲名
if ( s[0]==' ' && s[1]=='(' && s[4]==')' && s[5]==' ' ){
ExTrak=-1;
if ( kcn<=tr ){
return(-1); //多すぎ
}
//tr--;
CdTrak++;
l--;
i=(s[ 7]-'0')*0x10000*10+
(s[ 8]-'0')*0x10000 +
(s[10]-'0')*0x100 *10+
(s[11]-'0')*0x100 +
(s[13]-'0') *10+
(s[14]-'0');
//ListLong[tr]=O_ListLong[l];
ListStTm[tr]=addtime(O_ListStTm[l],i);
tnum[l]++;
s=&s[15];
for(;*s!=9;s++);
for(;*s==9;s++);
d=ListName[tr];
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
continue;
}
if ( l>max_ ){
l++;
break;
}
i=(s[ 7]-'0')*0x10000*10+
(s[ 8]-'0')*0x10000 +
(s[10]-'0')*0x100 *10+
(s[11]-'0')*0x100 +
(s[13]-'0') *10+
(s[14]-'0');
if ( O_ListLong[l]!=i )
break; //違う
ListStTm[tr] = O_ListStTm[l];
//ListLong[tr] = O_ListLong[l]; /**/
O_ListTrak[l]=tr; //
s=&s[15];
for(;*s!=9;s++);
for(;*s==9;s++);
d=ListName[tr];
for(i=0;i<40-2;i++){
if ( (j=(*d++=*s++))==0 )
break;
if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
*d++=*s++;
i++;
}
}
for(;i<40;i++)
*d++=0;
//fprintf_(1,ListName[tr]);
//fprintf_(1,"\r\n");
}
if ( l<=max_+1 )
;
else break;
}
CdListS=1; //CDLISTにあるなら 1
/*プログラムはある?*/
if ( s[0]=='\t' && s[1]=='<' ){ //既に読んでいる
s+=2;
for(MemLong=0;MemLong<100;){
for(;*s==' ';s++);
i=c_atoi(s,&j);
s+=j;
if ( i<1 || i>99 )
break;
MemSock[MemLong]=O_ListTrak[i];
if ( *s=='.' ){
s++;
i=c_atoi(s,&j);
s+=j;
if ( i>=0 && i<=9 )
MemSock[MemLong]+=i;
} else if ( *s=='a' || *s=='A' ){
s++;
for(j=1;j<tnum[i];j++)
MemSock[++MemLong]=O_ListTrak[i]+j;
}
MemLong++;
for(;*s==' ';s++);
if ( *s=='>' ) break;
s++;
}
if ( *s!='>' ) MemLong=0;
}
return(0);
}
/*****************************
タイトルリストに無し
タイトルリスト無し
*****************************/
void NoTtlFile()
{
int l;
for(l=1;l<=O_CdTrak;l++){
ListStTm[l]=O_ListStTm[l];
ListLong[l]=O_ListLong[l]; // 長さ
O_ListTrak[l]=l;
}
CdTrak=O_CdTrak;
ExTrak=0;
}
/******************************
文字列を数字に
******************************/
int c_atoi(m,n)
UNchar *m;
int *n;
{
int i=0,j=0;
for(;;){
if ( *m<(UNchar)'0' || *m>(UNchar)'9' )
break;
i=i*10+*m-'0'; j++; m++;
}
*n=j; /*うごいたかず!!*/
return(i);
}
/*----------------------------------------------------------------------------
危険割り込みルーチン
使用順
----------------------------------------------------------------------------*/
/************************************
BGM
{演奏していないなら演奏}
************************************/
void CdPlay_Bgm()
{
extern int BgmStAdds,BgmEdAdds;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo==0 )
CdPlay(BgmStAdds,BgmEdAdds);
B_KLE_D2();
return;
}
/************************************
リピート(1P)
{演奏していないなら演奏}
{違うトラックなら演奏}
************************************/
void CdPlay_Rept()
{
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo==0 ){
CdPlay(TrkNoS,TrkNoS);
} else if ( plyinf.track_no!=TrkNoS ){
CdPlay(TrkNoS,TrkNoS);
}
B_KLE_D2();
return;
}
/************************************
ランダム
演奏していないなら演奏
************************************/
void CdPlay_Rnd()
{
int i,j,r;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo!=0 ){ //演奏している
B_KLE_D2();
return;
}
if ( RndPt<0 ){
CdPlay_Rnd2();
} else if ( ++RndPt>=RndLong ){
if ( AutoMode==0 ){ // 0:ノーマル 1:オート
TrkNo=0;
TrkNoS=0;
RndPt--; //演奏ストップ
RndMode=0; // 0:ノーマル 1:ランダム
B_KLE_D2();
return;
} else {
CdPlay_Rnd2();
}
} else {
i=RndSock[RndPt];
r=CdPlay( i,i );
}
MemChkT();
B_KLE_D2();
return;
}
/*++++++++++++++*/
int CdPlay_Rnd2()
{
int i,h,r,l,j;
if ( CDIN==0 )
return(-1);
if ( MemLong==0 ){
for(i=0;i<max;i++)
RndSock[i]=i+1; // ランダムテーブル
RndLong=max;
} else {
for(i=0;i<MemLong;i++)
RndSock[i]=MemSock[i]; // ランダムテーブル
RndLong=MemLong;
}
Randomize(*(short*)(0x09CC));
for(i=0;i<100;i++){
h=MODU(Rand(),RndLong);
l=MODU(Rand(),RndLong);
if ( l==h )
l=MODU(Rand(),RndLong);
j=RndSock[h];
RndSock[h]=RndSock[l];
RndSock[l]=j;
}
if ( TrkNoS==RndSock[0] ){
j=RndSock[0];
RndSock[0]=RndSock[RndLong-1];
RndSock[RndLong-1]=j;
}
RndPt=0;
i=RndSock[RndPt];
r=CdPlay( i,i );
return(r);
}
/************************************
メモリー
(メモリー+AUTO)
{演奏していないなら演奏}
************************************/
void CdPlay_Mem()
{
int i,r;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo!=0 ){ //演奏している
B_KLE_D2();
return;
}
if ( ++MemPt>=MemLong ){
if ( AutoMode==0 ){ // 0:ノーマル 1:オート
TrkNo=0;
TrkNoS=0;
MemMode=0; // 0:ノーマル 1:メモリー
MemPt--; //演奏ストップ
B_KLE_D2();
return;
} else {
MemPt=0;
}
}
i=MemSock[MemPt];
r=CdPlay( i,i );
B_KLE_D2();
return;
}
/*++++++++++++++*/
void MemChkT()
{
int i;
if ( TrkNo==0 ){
MemPt=-1;
return;
}
for(i=0;i<MemLong;i++)
if ( TrkNo==MemSock[i] )
break;
if ( i<MemLong )
MemPt=i;
else MemPt=-1;
}
/************************************
オート[*]
{演奏していないなら演奏}
{TrkNoもちがうなら更新する}
************************************/
void CdPlay_Auto()
{
int i;
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo!=0 && plyinf.track_no!=TrkNo ){
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
MemChkT();
}
if ( MemLong!=0 ){
MemMode=-1; // 0:ノーマル 1:メモリー
CdPlay_Mem();
return;
}
if ( TrkNo==0 ){
if ( TrkNoS>=max )
CdPlay_all();
else CdPlay(TrkNoS+1,-1);
}
B_KLE_D2();
return;
}
/************************************
ノーマルCDチェック
{TrkNoもちがうなら更新する}
************************************/
void CdPlay___()
{
if ( CDIN==0 ){
B_KLE_D2();
return;
}
if ( TrkNo==0 ){
#if 0
if ( TrkNoS!=0 ){
if ( TrkNoS>=max ){
TrkNoS=0;
} else {
if ( MemLong!=0 ){
MemMode=-1; // 0:ノーマル 1:メモリー
CdPlay_Mem();
return;
}
CdPlay(TrkNoS+1,-1);
}
}
#endif
B_KLE_D2();
return;
}
if ( plyinf.track_no!=TrkNo ){
TrkNo=plyinf.track_no;
TrkNoS=TrkNo;
SetTrkLong();
MemChkT();
}
B_KLE_D2();
return;
}